package com.syg.servlet04;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

/**
 *  问：服务器是如何实现一个session为一个用户浏览器服务的？
 *  答：服务器创建session出来后，会把session的id号，以cookie的形式回写给客户机，
 *      这样，只要客户机的浏览器不关，再去访问服务器时，都会带着session的id号去，
 *      服务器发现客户机浏览器带session id过来了，就会使用内存中与之对应的session为之服务。
 *
 * 我猜想request.getSession()方法内部新创建了Session之后一定是做了如下的处理:
 *      //获取session的Id
 *      String sessionId = session.getId();
 *      //将session的Id存储到名字为JSESSIONID的cookie中
 *      Cookie cookie = new Cookie("JSESSIONID", sessionId);
 *      //设置cookie的有效路径
 *      cookie.setPath(request.getContextPath());
 *      response.addCookie(cookie);
 */
@WebServlet("/session")
public class _02_Session extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置服务器端以UTF-8编码进行输出
        resp.setCharacterEncoding("UTF-8");
        //设置浏览器以UTF-8编码进行接收,解决中文乱码问题
        resp.setContentType("text/html;charset=UTF-8");
        //获取输出流
        PrintWriter respOut = resp.getWriter();
        //使用request对象的getSession()获取session，如果session不存在则创建一个
        HttpSession session = req.getSession();
        //获取session的Id
        String sessionId = session.getId();

        //用户访问过之后重新设置用户的访问时间，存储到cookie中，然后发送到客户端浏览器
        Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//创建一个cookie，cookie的名字是lastAccessTime
        //设置Cookie的有效期为1天
        cookie.setMaxAge(24*60*60);
        //将cookie的有效期设置为0，命令浏览器删除该cookie
        //cookie.setMaxAge(0);
        //将cookie对象添加到response对象中，这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
        resp.addCookie(cookie);

        //判断session是不是新建的
        if(session.isNew()){
            //客户端浏览器禁用cookie之后,那么每次请求都将新建cookie
            respOut.write("session是新建的,新建session的id是"+sessionId);
        }else{
            respOut.write("session不是新建的,服务器已经存在该session了,服务器存在session的id是"+sessionId);
        }
    }
}
